#pragma once

//#include <srs_app_ingest.hpp>
#include <srs_core.hpp>

#ifdef SRS_AUTO_INGEST

#include <vector>

#include <srs_app_thread.hpp>
#include <srs_app_reload.hpp>

class SrsFFMPEG;
class SrsConfDirective;
class SrsPithyPrint;

/**
* ingester ffmpeg object.
*/
class SrsIngesterFFMPEG {
private:
    std::string vhost;
    std::string id;
    SrsFFMPEG* ffmpeg;
    int64_t starttime;
public:
    SrsIngesterFFMPEG();
    virtual ~SrsIngesterFFMPEG();
public:
    virtual int initialize(SrsFFMPEG* ff, const std::string& v, const std::string& i);
    // the ingest uri, [vhost]/[ingest id]
    virtual std::string uri();
    // the alive in ms.
    virtual int alive();
    virtual bool equals(const std::string& v, const std::string& i);
    virtual bool equals(const std::string& v);
public:
    virtual int start();
    virtual void stop();
    virtual int cycle();
    // @see SrsFFMPEG.fast_stop().
    virtual void fast_stop();
};

/**
* ingest file/stream/device,
* encode with FFMPEG(optional),
* push to SRS(or any RTMP server) over RTMP.
*/
class SrsIngester : public ISrsReusableThreadHandler, public ISrsReloadHandler {
private:
    std::vector<SrsIngesterFFMPEG*> ingesters;
private:
    SrsReusableThread* pthread;
    SrsPithyPrint* pprint;
public:
    SrsIngester();
    virtual ~SrsIngester();
public:
    virtual void dispose();
public:
    virtual int start();
    virtual void stop();
    // interface ISrsReusableThreadHandler.
public:
    virtual int cycle();
    virtual void on_thread_stop();
private:
    virtual void clear_engines();
    virtual int parse();
    virtual int parse_ingesters(SrsConfDirective* vhost);
    virtual int parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest);
    virtual int initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine);
    virtual void show_ingest_log_message();
    // interface ISrsReloadHandler.
public:
    virtual int on_reload_vhost_removed(const std::string& vhost);
    virtual int on_reload_vhost_added(const std::string& vhost);
    virtual int on_reload_ingest_removed(const std::string& vhost, const std::string& ingest_id);
    virtual int on_reload_ingest_added(const std::string& vhost, const std::string& ingest_id);
    virtual int on_reload_ingest_updated(const std::string& vhost, const std::string& ingest_id);
};

#endif
